记一次PostgreSQL删除重复数据

    PostgreSQL删除重复数据通常会用到伪列ctid,其表示的是数据记录的物理行信息,指的是一条记录位于哪个数据块的哪个位移上面--与oracle中伪列 rowid 的意义是相同的,但是形式不同;

   1、删除重复数据一般可用语句:

DELETE FROM table_name WHERE ctid NOT IN (SELECT MIN(ctid) FROM table_name GROUP BY ${id});

 其中:${id}为区分不同数据条目的字段,即为记录除ctid外的唯一标识列。

2、如果没有唯一标识字段,可根据表数据特点,通过多列进行数据重复度匹配。

比如一张醉驾测试数据表(),含被测试人(detected)、测试时间(detect_time)、测试结果(detect_result),测试人员编号(detector),测试设备编号(machine_num)等字段,数据如下所示:

因为同一个测试人员、测试设备在同一个测试时间下只能测试出一条结果,所以完全可以通过这三个字段进行数据重复性匹配,删除语句可写为:

DELETE FROM drunkdriver_detect WHERE ctid NOT IN (SELECT MIN(ctid) FROM drunkdriver_detect GROUP BY detector,machine_num,detect_time);

3、但是,如果这张表数据量较大,比如数据量为50万,SQL中的NOT IN带来的低效率将会极大的影响删除效率。

仔细分析SQL语句,会发现,如果重复数据越少,那么NOT IN后面的子句匹配出来的干净数据的ctid个数就会越多,NOT IN匹配的记录越多,整个SQL的执行效率就变得越慢。

想到这里,不如换一种思路,最终目的不就是去重嘛,倒不如把这些要删的数据留下,把原本想要留下的数据生成、插入到另一张新表,然后直接DROP旧表或者改掉它的名字,再将新表改名为正式使用的表,比如以上,SQL为:

CREATE TABLE drunkdriver_detect_tmp AS SELECT * FROM drunkdriver_detect WHERE ctid IN (SELECT MIN(ctid) FROM drunkdriver_detect GROUP BY detector,machine_num,detect_time);

去重之后的表名为drunkdriver_detect_tmp,删除旧表或改掉旧表名,将新表改名为旧表的表名就可以了,

这个效率就高多啦!!! 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Navicat Premium是一个数据库开发工具,可让您从单个应用程序同时连接到MySQL,MariaDB,MongoDB,SQL Server,Oracle,PostgreSQL和SQLite数据库。与Amazon RDS,Amazon Aurora,Amazon Redshift,Microsoft Azure,Oracle Cloud,Google Cloud和MongoDB Atlas等云数据库兼容。您可以快速轻松地构建,管理和维护数据库。 设置数据源连接后,可以使用“导入向导”将数据从多种格式或从ODBC传输到数据库中。将数据从表/集合,视图或查询结果导出为Excel,Access,CSV等格式。使用我们的内置编辑器添加,修改和删除录,您可以在Tree View,JSON View和类似电子表格的经典Grid View中方便地进行编辑。Navicat为您提供有效管理数据并确保流程平稳所需的工具。 Visual SQL / Query Builder将帮助您创建,编辑和运行SQL语句/查询,而不必担心语法和命令的正确用法。通过获取关键字建议并从编码中去除重复内容,使用“代码完成”和可自定义的代码段快速进行编码。使用我们的调试组件,例如设置断点,单步执行程序,查看和修改变量值以及检查调用堆栈,可以快速找到并纠正PL / SQL和PL / PGSQL编码错误。 使用我们专业的对象设计器创建,修改和管理所有数据库对象。使用复杂的数据库设计和建模工具将数据库转换为图形表示形式,以便您可以轻松地建模,创建和理解复杂的数据库。 我们的图表功能使您可以创建大型数据集的可视表示形式,并帮助您从数据中获得更深刻的见解。探索并发掘数据之间的模式,趋势和关系,并创建有效的视觉输出,以将您的发现显示在仪表板上以进行共享。 我们功能强大的本地备份/还原解决方案以及针对MongoDump,Oracle Data Pump和SQL Server Backup Utility的直观GUI,可指导您完成备份过程并减少潜在的错误。为可重复部署的过程设置自动化,例如在特定时间或日期执行数据库备份,MapReduce作业和脚本执行。无论您身在何处,都可以随时完成工作。 使用我们的内置模式可视化工具发现和探索您的MongoDB模式。分析文档并在集合中显示丰富的结构,以便您可以了解数据的架构,查找架构异常并轻松检查异常值。 通过SSH隧道和SSL建立安全连接,可确保每个连接都是安全,稳定和可靠的。支持不同的数据库服务器身份验证方法,例如MySQL和MariaDB的PAM身份验证,MongoDB的Kerberos和X.509身份验证以及PostgreSQL的GSSAPI身份验证。Navicat提供了更多的身份验证机制和高性能环境,因此您不必担心通过不安全的网络进行连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏舟飞流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值